/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MenuPrincipal;

import apunte.Apunte;
import apunte.ManejoApunte;
import apunte.Profesor;
import java.awt.GridLayout;
import java.awt.MenuBar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import modificar.modificarApunte;
import tabla.ModeloTabla;
import usuarios.Vendedor;
import ventas.realizarVenta;

/**
 *
 * @author martinLequerica
 */
public class MenuPrincipalController {

    private LinkedList<JMenuItem> lba;// lista Botones Agregar;
    private LinkedList<JMenuItem> lbb;//lista botones bkup
    private LinkedList<JMenuItem> lbe;// lista Botones Eliminar;
    private LinkedList<JMenuItem> lbm;// lista Botones Modificar;
    private LinkedList<JMenuItem> lbar; //lista botones archivo
    private LinkedList<JMenu> lm; //lista botones menu
    private LinkedList<Apunte> lla;//total
    private LinkedList<Apunte> llaVenta;//cargado en la lista
    private LinkedList<Apunte> llaT;//cargado en la tabla
    private String[] etiquetasBotones = {"Apunte", "Materia", "Profesor", "Carrera"};//creo las etiquetas de los items del menu
    private String[] etiquetasUsuario = {"Modificar", "agregar", "Cambiar Usuario"};
    private String[] etiquetasBkup = {"Crear Bkup","Recuperar Bkup"};
    private String[] etiquetasArchivo = {"Cerrar Turno","Cerrar caja del dia"};
    private String[] EtiquetasMenuBar = {"Agregar", "Eliminar", "Usuario","Back up","Archivo"};//creo las etiquetas del menu
    private MenuPrincipal mp; //menu principal
    private MenuBar mb; //menu bar
    private JPanel panelDerecho, panelIzq, panelTabla;
    private Vendedor vendedor;
    //tabla
    private ModeloTabla modelo;
    private JScrollPane scroll;

    public MenuPrincipalController(Vendedor v) throws SQLException {
        vendedor = v;
        //linked list
        lba = new LinkedList(); //lista de items agregar
        lbe = new LinkedList(); //lista de items eliminar
        lbm = new LinkedList();//lista items modificar
        lbar = new LinkedList();//lista items archivo
        lm = new LinkedList();
        lbb = new LinkedList();
        llaVenta = new LinkedList();
        //lista de todos los apuntes
        llaT = new LinkedList();
        //linked list

//creacion de la barra de menu
        mp = new MenuPrincipal();
        inicializaEtiquetasJmenu(lm);
        creoMenubar(mp.getJmenu(), lm);
        mp.getPrecioTotal().setText("0");

        inicializaEtiquetasBotones();//inicio las etiquetas
        inicializaMenuItems(lba, lbe);//las etiquetas quedan funcionando
//fin creacion de la barra de menu
        //creo los datos del vendedor
        mp.getPanelUsuario().add(new JLabel("Vendedor: "));
        mp.getPanelUsuario().add(new JLabel("Nombre: " + vendedor.getNombre()));
        mp.getPanelUsuario().add(new JLabel("Apellido: " + vendedor.getApellido()));
        // para mostrar el id vendedor
        //mp.getPanelUsuario().add(new JLabel(String.valueOf(vendedor.getIdVendedor())));




        modelo = mp.getModelo();
        
        setFalse(lba, lbe, v);



        lla = new ManejoApunte().getAllApuntes();
        llaT = new ManejoApunte().getAllApuntes();

        cargarTabla();

        Listeners(mp);





        listenersVenta();
        new listeners(lba, lbe, lbm, v, mp,lbb,lla,lbar);
        mp.getTabla().requestFocus();
        mp.getPrecioTotal().setEditable(false);



    }

    //Crea visualmente la barra de menu y sus items principales
    private void creoMenubar(JMenuBar jm, LinkedList<JMenu> lm) {
        Iterator<JMenu> i = lm.iterator();

        while (i.hasNext()) {
            JMenu next = i.next();

            jm.add(next);

        }

    }

    //inicializa las etiquetas
    private void inicializaEtiquetasBotones() {
        for (int i = 0; i < etiquetasBotones.length; i++) {

            lba.add(new JMenuItem(etiquetasBotones[i]));
            lbe.add(new JMenuItem(etiquetasBotones[i]));

        }

        for (int k = 0; k < etiquetasUsuario.length; k++) {

            lbm.add(new JMenuItem(etiquetasUsuario[k]));
        }
        for (int j = 0 ; j< etiquetasBkup.length;j++){
            lbb.add(new JMenuItem(etiquetasBkup[j]));
            
            
        }
        
        
        for (int m = 0 ; m<etiquetasArchivo.length; m++){
            
            lbar.add(new JMenuItem(etiquetasArchivo[m]));
            
        }
        
        
    }

    //inicializa las etiquetas principales del menu
    private void inicializaEtiquetasJmenu(LinkedList<JMenu> lm) {


        for (int i = 0; i < EtiquetasMenuBar.length; i++) {
            lm.add(new JMenu(EtiquetasMenuBar[i]));
        }
    }

    //pongo los items del menu en su lugar
    private void inicializaMenuItems(LinkedList<JMenuItem> lba, LinkedList<JMenuItem> lbe) {

        for (int i = 0; i < lba.size(); i++) {

            lm.get(0).add(lba.get(i));
            lm.get(1).add(lbe.get(i));

        }

        for (int k = 0; k < lbm.size(); k++) {
            lm.get(2).add(lbm.get(k));
        }
        
        for (int j=0;j<lbb.size();j++){
            lm.get(3).add(lbb.get(j));
            
        }
        
        for (int m=0;m<lbar.size();m++){
            
            lm.get(4).add(lbar.get(m));
            
        }
    
        

    }

//carga la tabla con todos los apuntes del sistema
    public void cargarTabla() {

        Iterator<Apunte> i = lla.iterator();

        while (i.hasNext()) {
            Apunte next = i.next();

            modelo.anhadeApunte(next);


        }



    }

    private void Listeners(final MenuPrincipal mp) {
        mp.getPopMenu().getModificar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {

                int sr = mp.getTabla().getSelectedRow();

                new modificarApunte(lla.get(sr));


            }
        });

        mp.getPopMenu().getAgregar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                //reacer
            }
        });

        //listener enter tabla
        mp.getTabla().addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent ke) {
            }

            @Override
            public void keyPressed(KeyEvent ke) {

                if (ke.getKeyCode() == 66) {

                    new FormBuscar(mp, llaT, lla).setVisible(true);

                }



                if (ke.getKeyCode() == 82) {
                    refresh();
                }

                if (ke.getKeyCode() == 86) {
                    new FormularioCantidad(lla.get(mp.getTabla().getSelectedRow()), llaVenta, mp.getModelLista(), mp, lla).setVisible(true);
                }

            }

            @Override
            public void keyReleased(KeyEvent ke) {
            }
        });




        mp.getPopLista().geteliminar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {

                JOptionPane.showMessageDialog(null, llaVenta.get(mp.getLista().getSelectedIndex()).getCantidadVenta());

            }
        });


        mp.getBuscar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {

                lla.clear();
                limpiarTabla();

                if (mp.getId().getText().equals("")) {
                    //si no se busca por id

                    //si el cod esta vacio
                    if (mp.getCod().getText().equals("")) {

                        if (mp.getProfesor().getText().equals("")) {


                            if (mp.getNombreApunte().getText().equals("")) {
                            } else {

                                for (int j = 0; j < llaT.size(); j++) {

                                    if (llaT.get(j).getNombreApunte().indexOf(mp.getNombreApunte().getText()) != -1) {

                                        lla.add(llaT.get(j));
                                        cargarTabla();
                                        break;

                                    }

                                }


                            }


                        } else {

                            for (int i = 0; i < llaT.size(); i++) {
                                LinkedList<Profesor> profesor = llaT.get(i).getProfesor();

                                for (int k = 0; k < profesor.size(); k++) {

                                    if (profesor.get(k).getNombre().indexOf(mp.getProfesor().getText()) != -1) {

                                        lla.add(llaT.get(k));
                                        cargarTabla();
                                        break;
                                    }
                                }


                            }



                        }


                    } else {//si cod no esta vacio
                        for (int i = 0; i < llaT.size(); i++) {

                            if (llaT.get(i).getLetra().equals(mp.getCod().getText())) {

                                lla.add(llaT.get(i));
                                cargarTabla();
                                break;
                            }

                        }

                    }





                } else {
                    //si se busca por id
                    for (int i = 0; i < llaT.size(); i++) {

                        if (llaT.get(i).getIdapunte() == Integer.parseInt(mp.getId().getText())) {

                            lla.add(llaT.get(i));

                            cargarTabla();

                            break;


                        }

                    }

                }

            }
        });



        mp.getCancelar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {

                refresh();
            }
        });


    }

    private void limpiarTabla() {

        int cant = modelo.getRowCount();
        for (int i = 0; i < cant; i++) {

            modelo.borraApunte(0);

        }
        lla.clear();

    }

    private void listenersVenta() {




        mp.getVender().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {

                mp.getTabla().requestFocus();

                if (llaVenta.size() != 0) {
                    try {
                        new realizarVenta(llaVenta, vendedor);
                    } catch (SQLException ex) {
                        Logger.getLogger(MenuPrincipalController.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    actualizarListaTotal();
                    llaVenta.clear();
                    limpiarTabla();
                    lla.clear();
                    mp.getModelLista().clear();
                    mp.getPrecioTotal().setText("0");
                } else {
                    JOptionPane.showMessageDialog(null, "No hay nada que vender");
                }


                //actualiza llaT para que se vean los valores reducidos


            }
        });

        mp.getVender().addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent ke) {
                
            }

            @Override
            public void keyPressed(KeyEvent ke) {


                 if (3 == 5){
                if (llaVenta.size() != 0) {
                    try {
                        new realizarVenta(llaVenta, vendedor);
                    } catch (SQLException ex) {
                        Logger.getLogger(MenuPrincipalController.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    actualizarListaTotal();
                    llaVenta.clear();
                    limpiarTabla();
                    lla.clear();
                    mp.getModelLista().clear();
                    mp.getPrecioTotal().setText("0");
                } else {
                    JOptionPane.showMessageDialog(null, "No hay nada que vender");
                }
                 }else {
                     
                     JOptionPane.showMessageDialog(null, "mankie");
                 }


            }

            @Override
            public void keyReleased(KeyEvent ke) {
                throw new UnsupportedOperationException("Not supported yet.");
            }
        });


    }

    private void imprimeLinkedList(LinkedList<Apunte> lla) {
        Iterator<Apunte> i = lla.iterator();

        while (i.hasNext()) {
            Apunte next = i.next();

            JOptionPane.showMessageDialog(null, next.getIdapunte());


        }

    }

    private void setFalse(LinkedList<JMenuItem> lba, LinkedList<JMenuItem> lbe, Vendedor v) {

        if (!v.getNombre().equals("fotocopiadora")) {

            for (int i = 0; i < lba.size(); i++) {

                lba.get(i).setEnabled(false);
                lbe.get(i).setEnabled(false);
                

            }
            
            for (int i = 0 ;i<lbb.size(); i++ ){
                
                lbb.get(i).setEnabled(false);
                
                
            }
            
            
            
        }

    }

    public void ListaVenta(int cantidad) {


        int sr = mp.getTabla().getSelectedRow();




        int cnt1 = lla.get(sr).getCantidad();




        if (cnt1 >= cantidad) {

            lla.get(sr).setCantidad(lla.get(sr).getCantidad() - cantidad);


            llaVenta.add(lla.get(sr));
            mp.getModelLista().removeAllElements();
            Iterator<Apunte> i = llaVenta.iterator();
            double precioT = 0;
            while (i.hasNext()) {

                Apunte next = i.next();
                precioT += Double.valueOf(next.getPrecio());
                mp.getModelLista().addElement(next.getNombreApunte());
                mp.getPrecioTotal().setText(String.valueOf(precioT * cantidad));



            }



        } else {
            JOptionPane.showMessageDialog(null, "Faltan apuntes");
        }

    }

    private void refresh() {
        mp.getModelLista().clear();
        mp.getPrecioTotal().setText("0");
        try {



            limpiarTabla();
            lla = new ManejoApunte().getAllApuntes();
            cargarTabla();
        } catch (SQLException ex) {
            Logger.getLogger(MenuPrincipalController.class.getName()).log(Level.SEVERE, null, ex);
        }
        llaVenta.clear();

    }

    private void buscar() {
    }

    private void actualizarListaTotal() {

        for (int i = 0; i < llaVenta.size(); i++) {

            for (int k = 0; k < llaT.size(); k++) {

                if (llaVenta.get(i).getIdapunte() == llaT.get(k).getIdapunte()) {

                    llaT.get(k).setCantidad(llaT.get(k).getCantidad() - 1);

                }

            }

        }

    }
}